const util = require('util')
const axios = require('axios')
const {UserModel} = require('../model/userModel')
const {generateToken} = require('../../core/util')
const {Auth} = require('../../middlewares/auth')
class WXManager {
  /**
   * 
   * @param {*} code 登陆时获取的code
   */
  static async codeToToken(code) {
    // code
    // code 小程序生成 微信
    // openid 唯一标识

    // 显示注册
    // 唯一标识
    // code
    // appid
    // appsecret
    // url

    const url = util.format(global.config.wx.loginUrl,
      global.config.wx.appId,
      global.config.wx.appSecret,
      code
      )
    const result = await axios.get(url)

    

    if (result.status !== 200) {
        throw new global.errs.AuthFailed("openid获取失败")
    }
    
    // 值	说明	最低版本
    // -1	系统繁忙，此时请开发者稍候再试	
    // 0	请求成功	
    // 40029	code 无效	
    // 45011	频率限制，每个用户每分钟100次	
    // 40226	高风险等级用户，小程序登录拦截 。风险等级详见用户安全解方案

    const errCode = result.data.errcode
    const errMsg = result.data.errmsg
    if (errCode) {
        throw new global.errs.AuthFailed("openid获取失败: " + errMsg)
    }

    // opedId
    // 建立档案 user uid
    // openId

    // 判断数据库是否存在微信用户 opendid
    let user = await UserModel.getUserByOpenid(result.data.openid)

    // 如果不存在，就创建一个微信小程序用户
    if (!user) {
        user = await UserModel.createUserByOpenid(result.data.openid)
    }
  // 
    return generateToken(user.id, Auth.AUSE)
  }
}

module.exports = {
  WXManager
}